

<!DOCTYPE html>
<html>
<head>
    <title>Pilgrim</title>

    <!-- meta -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- css -->
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="/static/blog/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/blog/css/pace.css">
    <link rel="stylesheet" href="/static/blog/css/custom.css">
    <link rel="stylesheet" href="/static/blog/css/highlights/github.css">

    <style>
        span.highlighted {
            color: yellow;
        }
    </style>

    <!-- js -->
    <script src="/static/blog/js/jquery-2.1.3.min.js"></script>
    <script src="/static/blog/js/bootstrap.min.js"></script>
    <script src="/static/blog/js/pace.min.js"></script>
    <script src="/static/blog/js/modernizr.custom.js"></script>
</head>

<body>
<div class="container">
    <header id="site-header">
        <div class="row">
            <div class="col-md-4 col-sm-5 col-xs-8">
                <div class="logo">
                    <h1><a href="/"><b>Pilgrim</b></a></h1>
                </div>
            </div><!-- col-md-4 -->
            <div class="col-md-8 col-sm-7 col-xs-4">
                <nav class="main-nav" role="navigation">
                    <div class="navbar-header">
                        <button type="button" id="trigger-overlay" class="navbar-toggle">
                            <span class="ion-navicon"></span>
                        </button>
                    </div>

                    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                        <ul class="nav navbar-nav navbar-right">
                            <li class="cl-effect-11"><a href="/" data-hover="首页">首页</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="博客">博客</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="关于">关于</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="联系">联系</a></li>
                        </ul>
                    </div><!-- /.navbar-collapse -->
                </nav>
                <div id="header-search-box">
                    <a id="search-menu" href="#"><span id="search-icon" class="ion-ios-search-strong"></span></a>
                    <div id="search-form" class="search-form">
                        <form role="search" method="get" id="searchform" action="/search/">
                            <input type="search" name="q" placeholder="搜索" required>
                            <button type="submit"><span class="ion-ios-search-strong"></span></button>
                        </form>
                    </div>
                </div>
            </div><!-- col-md-8 -->
        </div>
    </header>
</div>
<div class="copyrights">Collect from <a href="#">blog</a></div>
<div class="copyrights">Modified by <a href="#">博客</a></div>

<div class="content-body">
    <div class="container">
        <div class="row">
            <main class="col-md-8">
                
    <article class="post post-13">
        <header class="entry-header">
            <h1 class="entry-title">Celery</h1>
            <div class="entry-meta">
                <span class="post-category">
                    <a href="/category/3/">消息队列</a></span>
                <span class="post-date"><a href="#"><time class="entry-date"
                                                          datetime="2019年10月27日 17:38">2019年10月27日 17:38</time></a></span>
                <span class="post-author"><a href="#">chenjj</a></span>
                <span class="comments-link">
                    <a href="/post/13/#comment-area">0 评论</a></span>
                <span class="views-count"><a href="#">33 阅读</a></span>
            </div>
        </header>
        <div class="entry-content clearfix">
            <p><a href="https://blog.csdn.net/scrat_kong/article/details/81773613">点击查看celery通俗易懂的解释</a></p>
<p>1.定义</p>
<div class="codehilite"><pre><span></span> Celery: 一个简单灵活且可靠可以处理大量消息的分布式系统，可以在一台或者多台机器上运行。是一个 
 功能完备即插即用的任务队列。单个celery进程每分钟可以处理数以百万计的任务队列。通过消息进行 
 通信，使用消息队列在客户端和消费者之间进行协调。
 当用户触发的一个操作需要较长时间才能完成时，可以把这个任务交给Celery去执行，执行完再返回给 
 用户，将耗时操作从主任务中解耦出来，降低耦合性，提高用户体验。
</pre></div>


<p>Celery由生产者，中间人（broker），消费者三部分组成。</p>
<div class="codehilite"><pre><span></span>    生产者：
生产者生成消息，缓存到消息队列也就是中间人中，然后消费者读取消息队列中的消息并执行，本 
    质上就是函数。
    中间人：
用来存储生产者发送的消息。
    消费者：
从中间人那里获取任务，并执行任务。
    Celery:
创建一个实例，将他们三个关联起来。
</pre></div>


<p>Celery的架构由四部分组成，任务模块，消息中间件，任务执行单元和任务执行结果存储组成</p>
<div class="codehilite"><pre><span></span>    任务模块：task 包含异步任务和定时任务。其中异步任务通常在业务逻辑中被触发并发往任务队 
    列，而定时任务由celery beat进程周期性的将任务发往任务队列
    消息中间件：celery本身不提供消息服务，但是可以和第三方提供的消息中间件集成。包括 
    RabbitMQ、Redis、MongoDB等
    任务执行单元：worker是celery提供的任务执行单元，worker并发的运行在分布式的系统节点中
    任务结果存储：task result store用来讯处worker执行的任务结果，celery支持以不同凡是存储任务 
    的结果，包括Redis，memcached，mangoDB等
</pre></div>


<p>安装及配置和使用方法</p>
<div class="codehilite"><pre><span></span>    <span class="err">安装</span><span class="n">celery</span><span class="err">：</span><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">U</span> <span class="n">Celery</span>
    <span class="err">定义</span><span class="n">celery包</span><span class="err">：在工程下创建</span><span class="n">celery_tasks包</span>
    <span class="err">创建</span><span class="n">celery实例</span><span class="err">：在</span><span class="n">celery_tasks包中创建main</span><span class="o">.</span><span class="n">py文件</span>
    <span class="n">Import</span> <span class="n">os</span>
    <span class="kn">from</span> <span class="nn">celery</span> <span class="kn">import</span> <span class="n">Celery</span>
    <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;DJANGO_SETTINGS_MODULE&quot;</span><span class="p">,</span><span class="s2">&quot;MD_mall.settings&quot;</span><span class="p">)</span><span class="kn">from</span> <span class="nn">celery</span>
    <span class="n">celery_app</span> <span class="o">=</span> <span class="n">Celery</span><span class="p">(</span><span class="err">‘</span><span class="n">celery_tasks</span><span class="err">’</span><span class="p">)</span>
    <span class="err">加载</span><span class="n">celery配置</span><span class="err">：在</span><span class="n">celery_tasks包中创建config</span><span class="o">.</span><span class="n">py文件</span>
    <span class="n">broker_url</span> <span class="o">=</span> <span class="err">“</span><span class="n">redis</span><span class="p">:</span><span class="o">//</span><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span><span class="o">/</span><span class="mi">14</span><span class="err">”</span>
    <span class="n">Result_backend</span> <span class="o">=</span> <span class="err">“</span><span class="n">redis</span><span class="p">:</span><span class="o">//</span><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span><span class="o">/</span><span class="mi">15</span><span class="err">”</span>
    <span class="err">在</span><span class="n">main</span><span class="o">.</span><span class="n">py文件中</span><span class="err">：</span><span class="n">celery_app</span><span class="o">.</span><span class="n">config_from_object</span><span class="p">(</span><span class="err">‘</span><span class="n">celery_tasks</span><span class="o">.</span><span class="n">config</span><span class="err">’</span><span class="p">)</span>
    <span class="err">定义发送短信的任务：注册任务：</span><span class="n">main</span><span class="o">.</span><span class="n">py文件中</span>
    <span class="n">Celery_app</span><span class="o">.</span><span class="n">autodiscover_tasks</span><span class="p">([</span><span class="err">‘</span><span class="n">celery_tasks</span><span class="o">.</span><span class="n">sms</span><span class="err">’</span><span class="p">])</span>
    <span class="err">定义任务：在</span><span class="n">celery_tasks中创建sms包在创建tasks</span><span class="o">.</span><span class="n">py文件</span>
    <span class="err">写入耗时操作的代码</span>
    <span class="err">启动</span><span class="n">celery服务</span><span class="err">：在</span><span class="n">Terminal中执行</span>
    <span class="err">进入到工程目录下，执行</span> <span class="n">celery</span> <span class="o">-</span><span class="n">A</span> <span class="n">celery_tasks</span><span class="o">.</span><span class="n">main</span> <span class="n">worker</span> <span class="o">-</span><span class="n">l</span> <span class="n">info</span>
</pre></div>


<p>应用范围：</p>
<div class="codehilite"><pre><span></span>    ①处理一些耗时操作
    ②处理定时任务
    ③发送短信、邮件等
</pre></div>


<p>Celery+RabbitMQ</p>
<div class="codehilite"><pre><span></span>    特点：
        可靠性：RabittMQ功能更加完备，性能也能加稳定。使用RabbitMQ可以在断点的情况下还能 
             保存数据，而使用redis可能会造成数据的丢失。
         灵活的路由：对于典型的路由功能，RabittMQ已经提供了一些内置的交换器来实现。
         扩展性：多个RabittMQ节点可以组成一个集群。
         高可用性：队列可以在集群中的机器上设置镜像，使得在部分节点出现问题的情况下仍可使 
             用。
         通用性：几乎支持所有的常用语言，如java,python,PHP,C等
         插件机制：提供了许多插件，也可以自己定义插件然后使用
</pre></div>


<p>Celery+kafka：</p>
<div class="codehilite"><pre><span></span>  特点：
 高吞吐量
 能承受大量积压
 低延迟处理消息
 能支持分区，分布式，实时处理且有容错能力
  持久化：
  消息系统一般不提供持久化，消息被消费了也就没有意义了，不像数据库，不过kafka会把消息写入 
  日志，从而实现消息的持久化。
  应用场景：
  应用于系统监控、网民用户行为跟踪（如淘宝等）。
</pre></div>


<p>三种消息队列的对比:  </p>
<div class="codehilite"><pre><span></span>    RabbitMQ
支持多种协议，但也正因如此，它非常重量级，更适合企业级开发，同时实现Broker构架，消息在 
   发送给客户端时先在中心队列排队，对路由，负载均衡或者数据持久化都有很好的支持。
   Redis
   是基于key-value对的nosql数据库，开发维护很活跃，是一个轻量级的消息队列，适用于数据较少的 
   情况。
   Kafka
   是一款高性能跨语言分布式消息队列，具有快速、持久化、高吞吐率的特点，是一个非常轻量级的 
   消息队列。
</pre></div>


<p>RabbitMQ介绍和使用</p>
<div class="codehilite"><pre><span></span> 如何将耗时任务从主业务中解耦出来？
1. 生产者消费者设计模式
 最常用的解耦方式之一，寻找中间人(broker)搭桥，保证两个业务没有直接关联。
 我们称这一解耦方式为：生产者消费者设计模式
 生产者生成消息，缓存到消息队列中，消费者读取消息队列中的消息并执行。
 耗时任务发送的信息，缓存到消息队列中，消费者读取消息队列中的发送信息并执行。
</pre></div>


<p>RabbitMQ介绍</p>
<div class="codehilite"><pre><span></span>  消息队列是消息在传输的过程中保存消息的容器。
  现在主流消息队列有：RabbitMQ、ActiveMQ、Kafka等等。
  RabbitMQ和ActiveMQ比较
  系统吞吐量：RabbitMQ好于ActiveMQ
  持久化消息：RabbitMQ和ActiveMQ都支持
  高并发和可靠性：RabbitMQ好于ActiveMQ
  RabbitMQ和Kafka：
 系统吞吐量：RabbitMQ弱于Kafka
 可靠性和稳定性：RabbitMQ好于Kafka比较
 设计初衷：Kafka是处理日志的，是日志系统，所以并没有具备一个成熟MQ应该具备的特性。
 综合考虑，选择RabbitMQ作为消息队列。
</pre></div>
            <div class="widget-tag-cloud">
                <ul>
                    标签：
                    
                </ul>
            </div>
        </div>
    </article>
    <section class="comment-area" id="comment-area">
        <hr>
        <h3>发表评论</h3>
        <form action="/comment/post/13/" method="post" class="comment-form">
            
            <div class="row">
                <div class="col-md-4">
                    <label for="id_name">名字：</label>
                    <input id="id_name" maxlength="100" name="name" type="text" required />
                    
                </div>
                <div class="col-md-4">
                    <label for="id_email">邮箱：</label>
                    <input id="id_email" maxlength="255" name="email" type="email" required />
                    
                </div>
                <div class="col-md-4">
                    <label for="id_url">URL：</label>
                    <input id="id_url" maxlength="200" name="url" type="url" />
                    
                </div>
                <div class="col-md-12">
                    <label for="id_text">评论：</label>
                    <textarea cols="40" id="id_text" name="text" rows="10" required>
</textarea>
                    
                    <button type="submit" class="comment-btn">发表</button>
                </div>
            </div>    <!-- row -->
        </form>
        <div class="comment-list-panel">
            <h3>评论列表，共 <span>0</span> 条评论</h3>
            <ul class="comment-list list-unstyled">
                
                    暂无评论
                
            </ul>
        </div>
    </section>

            </main>
            <aside class="col-md-4">
                
    <div class="widget widget-content">
        <h3 class="widget-title">文章目录</h3>
        <div class="toc">
<ul></ul>
</div>

    </div>

                <div class="widget widget-recent-posts">
                    <h3 class="widget-title">最新文章</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/post/23/">数据分析推荐书籍</a>
                            </li>
                        
                            <li>
                                <a href="/post/32/">提高并发的方法</a>
                            </li>
                        
                            <li>
                                <a href="/post/25/">Python数据结构与算法（几种排序）</a>
                            </li>
                        
                            <li>
                                <a href="/post/21/">下山</a>
                            </li>
                        
                            <li>
                                <a href="/post/19/">cjj</a>
                            </li>
                        
                    </ul>
                </div>
                <div class="widget widget-archives">
                    <h3 class="widget-title">归档</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/archives/2019/12/">2019
                                    年 12 月</a>
                            </li>
                        
                            <li>
                                <a href="/archives/2019/10/">2019
                                    年 10 月</a>
                            </li>
                        
                            <li>
                                <a href="/archives/2019/8/">2019
                                    年 8 月</a>
                            </li>
                        
                    </ul>
                </div>

                <div class="widget widget-category">
                    <h3 class="widget-title">分类</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/category/1/">陈俊杰 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/2/">数据库 <span
                                        class="post-count">(6)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/3/">消息队列 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/4/">http、tcp/ip <span
                                        class="post-count">(6)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/5/">多任务 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/6/">redis <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/7/">git <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/8/">状态保持 <span
                                        class="post-count">(2)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/10/">Docker <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/11/">搜索引擎 <span
                                        class="post-count">(2)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/12/">数据分析 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/13/">数据结构与算法 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/14/">markdown语法 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/15/">非阻塞式IO <span
                                        class="post-count">(4)</span></a>
                            </li>
                        
                    </ul>
                </div>

                <div class="widget widget-tag-cloud">
                    <h3 class="widget-title">标签</h3>
                    
                    <ul>
                        
                            暂无标签！
                        
                    </ul>
                </div>

                <div class="rss">
                    <a href="#">才华撑不起野心，经济撑不起梦想</a>
                </div>
            </aside>
        </div>
    </div>
</div>
<footer id="site-footer">
    <div class="container">
        <div class="row">
            <div class="col-md-12">

                </p>
            </div>
        </div>
    </div>
</footer>

<!-- Mobile Menu -->
<div class="overlay overlay-hugeinc">
    <button type="button" class="overlay-close"><span class="ion-ios-close-empty"></span></button>
    <nav>
        <ul>
            <li><a href="/">首页</a></li>
            <li><a href="#">博客</a></li>
            <li><a href="#">关于</a></li>
            <li><a href="#">联系</a></li>
        </ul>
    </nav>
</div>

<script src="/static/blog/js/script.js"></script>

</body>
</html>
